/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 石方旭
 * Date: 2022-04-27
 * Time: 23:22
 */
public class LinkedList<E> {

    private class Node{
        // 1、当前节点存储的值
        public  E e;

        // 2、当前节点存储的执行下一个节点的地址
        public  Node next;

        public Node(E e, Node next){
            this.e = e;
            this.next = next;
        }

        public Node(E e){
            this(e, null);
        }

        public Node(){
            this(null, null);
        }
    }

        // 元素的数量
    private int size;
    private Node dummyHead;

    public LinkedList(){
        dummyHead = new Node();
        size = 0;
    }

    // 1、获取链表中的元素个数
    public  int getSize(){
        return size;
    }

    // 2、判断链表是否为空
    public boolean isEmpty(){
        return  size == 0;
    }

    // 3、在链表头添加元素
    public void addFirst(E e){
        add(0 ,e);
    }

    // 4、在链表中间添加元素
    public void add(int index ,E e){

        Node prev = dummyHead;

        // 需要遍历 index - 1 次，找到 prev 所在的位置
        for( int i = 0 ; i < index ; i++){
            prev = prev.next;
        }

        Node node = new Node(e);

        node.next = prev.next;

        prev.next = node;

        size++;
    }

    // 5、在链表尾部添加元素
    public void addLast(E e){
        add(size,e);
    }

    // 6、获取链表的第 index 个位置的元素
    public E get(int index) {

        Node cur = dummyHead;

        for (int i = 0; i <=index; i++) {
            cur = cur.next;
        }
        return cur.e;
    }

    // 获得链表的第一个元素
    public E getFirst(){
        return get(0);
    }

    // 获得链表的最后一个元素
    public E getLast(){
        return get(size - 1);
    }

    // 8、修改链表的第 index 个位置的元素
    public void set(int index,E e){

        Node cur = dummyHead;

        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }

        cur.e = e;
    }

    // 9、查找链表中是否有该元素
    public boolean contains(E e){
        Node cur = dummyHead;

        // 从头到尾遍历所有元素，直到找到那个元素，或者遍历结束后找不到
        while (cur != null){
            if(cur.e.equals(e)){
                return  true;
            }
            cur = cur.next;
        }

        return  false;
    }

    // 10、删除链表的第 index 个位置的元素
    public E remove(int index){

        Node prev = dummyHead;

        for(int i = 0 ; i < index ; i++){
            prev = prev.next;
        }

        Node retNode = prev.next;
        prev.next = retNode.next;
        retNode.next = null;

        size--;
        return  retNode.e;
    }

    // 11、清空所有元素
    public void clear(){
        size = 0;
        dummyHead = null;
    }

    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();

        Node cur = dummyHead.next;
        while(cur != null){
            res.append(cur.e + "-›");
            cur = cur.next;
        }
        res.append("NULL");

        return res.toString();
    }

}